#include "QCalendarEdit.h"
#include <QDateTime>
#include "QCalendarWidgetEx.h"

QCalendarEdit::QCalendarEdit(QWidget *parent)
    : QComboBox(parent)
{
    setEditable(true);
    _pCalendar = new QCalendarWidgetEx(this);
    _pCalendar->setWindowFlags(Qt::Popup);

    connect(_pCalendar, &QCalendarWidgetEx::dateTimeActivated, this, [this](const QDateTime& dt) {
        QString nStr = dt.toString(_dispalyFormat);
        QString oStr = currentText();
        if (oStr != nStr) {
            setEditText(nStr);
            emit dateTimeChanged(dt);
        }
        _pCalendar->hide();
        hidePopup();
    });
}

QCalendarEdit::~QCalendarEdit()
{}

QDateTime QCalendarEdit::datetime() const
{
    return QDateTime::fromString(currentText(), _dispalyFormat);
}

void QCalendarEdit::setDisplayFormat(const QString& format)
{
    _dispalyFormat = format;
}

void QCalendarEdit::setDateTime(const QDateTime& dt)
{
    setCurrentText(dt.toString(_dispalyFormat));
}

void QCalendarEdit::setMinDateTime(const QDateTime& dt)
{
    _pCalendar->setMinimumDate(dt.date());
    _pCalendar->setMinDateTime(dt);
}

void QCalendarEdit::setMaxDateTime(const QDateTime& dt)
{
    _pCalendar->setMaximumDate(dt.date());
    _pCalendar->setMaxDateTime(dt);
}

QDateTime QCalendarEdit::minDateTime()
{
    return _pCalendar->minDateTime();
}

QDateTime QCalendarEdit::maxDateTime()
{
    return _pCalendar->maxDateTime();
}

void QCalendarEdit::showPopup()
{
    _pCalendar->show();
    const QPoint& pt = mapToGlobal(QPoint(0, height()));
    _pCalendar->move(pt);
}
